/*
Copyright [2012] [Maria Eugenia Malagamba]
Copyright [2012] [Leandro Pellegrino]
Copyright [2012] [Julia Gambuzzi]
Copyright [2012] [Ignacio Capodanno]

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
*/

#pragma once
#include <vector>
#include "../Parser/Hidratador.h"
#include "Tablero.h"
#include "Sonido.h"
#include "Animacion.h"
#include "../Bonus/Bonus.h"
#include "../Entidades/Pintable.h"
#include "../sockets/Cliente.h"
#include "../sockets/Server.h"
#include "../UI/Boton.h"
#include "SDL.h"
#include <string>
#include<iostream>

using namespace std;
using namespace Entidades;
using namespace Parser;

class PartidaCliente
{
private:
	Tablero* tablero;
	string escenario;
	int numeroNave;
	int numeroNaveOtroCliente;
	string nombreCliente;
	string pathCarpetaCliente;
	Nave* naveOtroCliente;
	estados_juego resultadoPartida;
	Sonido* sonido;
	vector<Animacion*>* animaciones;
	Jugador* jugadorPartida;
	Jugador* jugadorContrario;
	
	void setResultadoPartida(estados_juego resultado);
	void pintarBase(Jugador* jugador);
	void setNombreCliente(string nombre);

	typedef struct RecibirEstadoEscenario_Data { 
		PartidaCliente* partidaCliente;
	} RECIBIRESTADOESCENARIO_DATA;


	static DWORD WINAPI RecibirEstadoEscenario_StaticThreadStart(void* Param)
	{
		RecibirEstadoEscenario_Data* data = (RecibirEstadoEscenario_Data*) Param;
		return data->partidaCliente->recibirEstadoEscenarioThread();
	}

	// END  - Funciones de hilos

	bool recibirEstadoEscenarioThread();
	void animacionesBonus(bonus_disponibles bonusUsado, Pintable* pintable);

public:
	PartidaCliente(int numeroNave);

	Cliente* cliente;
	string getNombreCliente();

	int actualizarNave(char* mensaje, int punteroBuffer);
	int actualizarNaveOtroCliente(char* mensaje, int punteroBuffer);
	int actualizarAsteroides(char* mensaje,int punteroBuffer);
	int actualizarArmas(char* mensaje,int punteroEnBuffer);
	int actualizarJugadores(char* mensaje,int punteroEnBuffer);
	int actualizarBonus(char* mensaje,int punteroEnBuffer);
	int actualizarDefensas(char* mensaje,int punteroEnBuffer, Nave* nave);

	int unirseAPartida(string puerto, string host);
	int recibirEscenario(string nombreJugador);
	void iniciar(int naveOtroCliente,int numeroJugador, string nombreOtroCliente);

	int actualizarAsteroidesBis(char* mensajeServidor, int punteroBuffer);

	bool recibirEstadoEscenario();
	estados_juego getResultadoPartida();

	~PartidaCliente(void);
};